/*
 * Copyright © 2024-2025 Wenze Wei
 *
 * This file is part of StadionOS.
 *
 * This Source Code Form is subject to the terms of the GNU General Public License, v. 2.0.
 * You can obtain a copy of the GPL at
 * https://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
 * the specific language governing rights and limitations under the License.
 */

#include "../include/math.h"

/**
 * @brief Calculates the square root of a double.
 *
 * This function returns the square root of the given double value.
 * It returns NAN if the input value is negative.
 *
 * @param x The double value.
 * @return double The square root of x.
 */
double Ssqrt(double x) {  
    if (x < 0)
        return DNAN;

    if (x == 0) return 0;
    double guess = x / 2.0;
    double result;  

    while (true) {  
        result = 0.5 * (guess + x / guess);
        if (Sabsolute(result - guess) < DEPSILON) {
            return result;  
        }  
        guess = result;  
    }  
}
